package Ep01_Array.Feb21st_1360;

/**
 * @author Jimmy Zhan WORKSTATION
 * @Date 2023/2/21 9:44
 * 说明：力扣 1360，计算两个日期之间差多少天
 */

public class Best {
    // 一年中每个月份的天数（平年、闰年则额外加1天）
    int[] _365M = new int[]{31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

    public static void main(String[] args) {
        Best b = new Best();
        int i = b.daysBetweenDates("2020-01-15", "2019-12-31");
        System.out.println(i);
    }

    public int daysBetweenDates(String date1, String date2) {
        int[] dates1 = parseDate(date1), dates2 = parseDate(date2);
        return Math.abs(calculateDays(dates1[0], dates1[1], dates1[2]) - calculateDays(dates2[0], dates2[1], dates2[2]));
    }

    private int calculateDays(int year, int month, int day) {
        // day 归一，dayCal表示与当月1号的天数差
        int dayCal = day - 1;
        // month 归一，归上个月的所有天数，举例：从2月1日归一到1月1日，归的天数是1月的31天，而不是2月的天数
        for (int i = month; i > 1; i--) {
            dayCal += _365M[i - 1 - 1];
        }
        // year 归一，先结算当年是否是闰年，再加上到元年元月元日的4闰年带来的29日，减去100闰年不该带来的29日，加上400闰年被减去的29日
        if (((year % 4 == 0 && year % 100 !=0) || year % 400 == 0) && month > 2){
            dayCal ++;
        }
        dayCal += (365 * (year - 1) + (year - 1) / 4 - (year - 1) / 100 + (year - 1) / 400);
        return dayCal;
    }

    int[] parseDate(String date) {
        // 获取String中指定位置的int，直接将String转为int，而不经过Date类型
        return new int[]{
                Integer.valueOf(date.substring(0, 4)),
                Integer.valueOf(date.substring(5, 7)),
                Integer.valueOf(date.substring(8, 10))
        };
    }

}
